p2m: merge ptp allocation
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 13 Apr 2010 11:20:48 +0000 (12:20 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 13 Apr 2010 11:20:48 +0000 (12:20 +0100)
Signed-off-by: Christoph Egger <Christop.Egger@amd.com>
xen/arch/x86/mm/hap/p2m-ept.c
xen/arch/x86/mm/hap/private.h
xen/arch/x86/mm/p2m.c
xen/include/asm-x86/p2m.h

index 45f6285677bbafa80f0e019dac5c014a20551cb2..1d4fe157c8bb4a4b21c29cd5e8f9db5d2e00963d 100644 (file)
@@ -97,14 +97,10 @@ static int ept_set_middle_entry(struct domain *d, ept_entry_t *ept_entry)
 {
     struct page_info *pg;
 
-    pg = d->arch.p2m->alloc_page(d);
+    pg = p2m_alloc_ptp(d, 0);
     if ( pg == NULL )
         return 0;
 
-    pg->count_info = 1;
-    pg->u.inuse.type_info = 1 | PGT_validated;
-    page_list_add_tail(pg, &d->arch.p2m->pages);
-
     ept_entry->emt = 0;
     ept_entry->ipat = 0;
     ept_entry->sp_avail = 0;
index cb51426f168c9fba8dafaa3f89bcb4b0fe1731f1..e2376293767b7491acc05f2bcb298807bd58991a 100644 (file)
@@ -30,5 +30,4 @@ unsigned long hap_gva_to_gfn_3_levels(struct vcpu *v, unsigned long gva,
 unsigned long hap_gva_to_gfn_4_levels(struct vcpu *v, unsigned long gva,
                                      uint32_t *pfec);
 
-
-#endif /* __SVM_NPT_H__ */
+#endif /* __HAP_PRIVATE_H__ */
index 53de2cf23bf4591b575bf03392fcafbf94ac150f..916fdc2de83e6f7f0eaa69feb5b54e11346c4b3f 100644 (file)
@@ -134,6 +134,22 @@ p2m_find_entry(void *table, unsigned long *gfn_remainder,
     return (l1_pgentry_t *)table + index;
 }
 
+struct page_info *
+p2m_alloc_ptp(struct domain *d, unsigned long type)
+{
+    struct page_info *pg;
+
+    pg = d->arch.p2m->alloc_page(d);
+    if (pg == NULL)
+        return NULL;
+
+    page_list_add_tail(pg, &d->arch.p2m->pages);
+    pg->u.inuse.type_info = type | 1 | PGT_validated;
+    pg->count_info |= 1;
+
+    return pg;
+}
+
 // Walk one level of the P2M table, allocating a new table if required.
 // Returns 0 on error.
 //
@@ -156,15 +172,14 @@ p2m_next_level(struct domain *d, mfn_t *table_mfn, void **table,
     /* PoD: Not present doesn't imply empty. */
     if ( !l1e_get_flags(*p2m_entry) )
     {
-        struct page_info *pg = d->arch.p2m->alloc_page(d);
+        struct page_info *pg;
+
+        pg = p2m_alloc_ptp(d, type);
         if ( pg == NULL )
             return 0;
-        page_list_add_tail(pg, &d->arch.p2m->pages);
-        pg->u.inuse.type_info = type | 1 | PGT_validated;
-        pg->count_info |= 1;
 
         new_entry = l1e_from_pfn(mfn_x(page_to_mfn(pg)),
-                                 __PAGE_HYPERVISOR|_PAGE_USER);
+                                 __PAGE_HYPERVISOR | _PAGE_USER);
 
         switch ( type ) {
         case PGT_l3_page_table:
@@ -195,16 +210,15 @@ p2m_next_level(struct domain *d, mfn_t *table_mfn, void **table,
     if ( type == PGT_l2_page_table && (l1e_get_flags(*p2m_entry) & _PAGE_PSE) )
     {
         unsigned long flags, pfn;
-        struct page_info *pg = d->arch.p2m->alloc_page(d);
+        struct page_info *pg;
+
+        pg = p2m_alloc_ptp(d, PGT_l2_page_table);
         if ( pg == NULL )
             return 0;
-        page_list_add_tail(pg, &d->arch.p2m->pages);
-        pg->u.inuse.type_info = PGT_l2_page_table | 1 | PGT_validated;
-        pg->count_info = 1;
-        
+
         flags = l1e_get_flags(*p2m_entry);
         pfn = l1e_get_pfn(*p2m_entry);
-        
+
         l1_entry = map_domain_page(mfn_x(page_to_mfn(pg)));
         for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ )
         {
@@ -224,13 +238,12 @@ p2m_next_level(struct domain *d, mfn_t *table_mfn, void **table,
     if ( type == PGT_l1_page_table && (l1e_get_flags(*p2m_entry) & _PAGE_PSE) )
     {
         unsigned long flags, pfn;
-        struct page_info *pg = d->arch.p2m->alloc_page(d);
+        struct page_info *pg;
+
+        pg = p2m_alloc_ptp(d, PGT_l1_page_table);
         if ( pg == NULL )
             return 0;
-        page_list_add_tail(pg, &d->arch.p2m->pages);
-        pg->u.inuse.type_info = PGT_l1_page_table | 1 | PGT_validated;
-        pg->count_info |= 1;
-        
+
         /* New splintered mappings inherit the flags of the old superpage, 
          * with a little reorganisation for the _PAGE_PSE_PAT bit. */
         flags = l1e_get_flags(*p2m_entry);
index 0fb485661f2deb952f49eed329071b84c33f3ed3..71617f7e928aafe2abffa4d36c97df88cdcf9f7a 100644 (file)
@@ -444,6 +444,8 @@ int p2m_mem_paging_prep(struct domain *d, unsigned long gfn);
 /* Resume normal operation (in case a domain was paused) */
 void p2m_mem_paging_resume(struct domain *d);
 
+struct page_info *p2m_alloc_ptp(struct domain *d, unsigned long type);
+
 #endif /* _XEN_P2M_H */
 
 /*